package com.dhy.payutil.alipay;

import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;

public class AlipayInfo {
	/**
	 * 合作者身份ID
	 */
	String partner;
	/**
	 * 卖家支付宝账号
	 */
	String seller_id;
	/**
	 * 商户网站唯一订单号
	 */
	public String out_trade_no;
	/**
	 * 商品名称
	 */
	public String subject;
	/**
	 * 商品详情
	 */
	public String body;
	/**
	 * 商品金额
	 */
	public String total_fee;
	/**
	 * 服务器异步通知页面路径
	 */
	public String notify_url;
	/***
	 * 接口名称， 固定值
	 */
	final String service = "mobile.securitypay.pay";
	/***
	 * 支付类型， 固定值
	 */
	final String payment_type = "1";
	/***
	 * 参数编码， 固定值
	 */
	final String _input_charset = "utf-8";
	/***
	 * 设置未付款交易的超时时间
	 * 默认30分钟，一旦超时，该笔交易就会自动被关闭。
	 * 取值范围：1m～15d。
	 * m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
	 * 该参数数值不接受小数点，如1.5h，可转换为90m。
	 */
	public String it_b_pay = "30m";
	/***
	 * 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
	 */
	public String return_url = "m.alipay.com";
	/***
	 * 调用银行卡支付，需配置此参数，参与签名， 固定值
	 */
	final String paymethod = "expressGateway";

	@Deprecated
	@Override
	public String toString() {
		return super.toString();
	}

	/**
	 * @param partner   合作者身份ID
	 * @param seller_id 卖家支付宝账号
	 */
	String toString(String partner, String seller_id, boolean bankCard, String RSA_PRIVATE) throws Exception {
		this.partner = partner;
		this.seller_id = seller_id;
		Map<String, Object> map = loadData();
		if (!bankCard) map.remove("paymethod");
		String content = implode(map);
		//implode sign info
		String sign = URLEncoder.encode(AlipaySignUtils.sign(content, RSA_PRIVATE), "UTF-8");
		map.put("sign", sign);
		map.put("sign_type", "RSA");
		return implode(map);
	}

	private Map<String, Object> loadData() {
		Map<String, Object> map = new LinkedHashMap<>();
		map.put("partner", this.partner);
		map.put("seller_id", this.seller_id);
		map.put("out_trade_no", this.out_trade_no);
		map.put("subject", this.subject);
		map.put("body", this.body);
		map.put("total_fee", this.total_fee);
		map.put("notify_url", this.notify_url);
		map.put("service", this.service);
		map.put("payment_type", this.payment_type);
		map.put("_input_charset", this._input_charset);
		map.put("it_b_pay", this.it_b_pay);
		map.put("return_url", this.return_url);
		map.put("paymethod", this.paymethod);
		return map;
	}

	private String implode(Map<String, Object> map) {
		StringBuilder sb = new StringBuilder();
		for (String key : map.keySet()) {
			sb.append("&").append(key).append("=\"").append(map.get(key)).append("\"");
		}
		sb.deleteCharAt(0);
		return sb.toString();
	}
}
